#include "TM1637.h"

struct bflb_device_s *gpio_1637;

/* 数码管支持的数字 */
unsigned char tab[] = {
    0x3F, /*0*/
    0x06, /*1*/
    0x5B, /*2*/
    0x4F, /*3*/
    0x66, /*4*/
    0x6D, /*5*/
    0x7D, /*6*/
    0x07, /*7*/
    0x7F, /*8*/
    0x6F, /*9*/
    0x77, /*10 A*/
    0x7C, /*11 b*/
    0x58, /*12 c*/
    0x5E, /*13 d*/
    0x79, /*14 E*/
    0x71, /*15 F*/
    0x76, /*16 H*/
    0x38, /*17 L*/
    0x54, /*18 n*/
    0x73, /*19 P*/
    0x3E, /*20 U*/
    0x00, /*21 黑屏*/
};

void TM1637_init()
{
    gpio_1637 = bflb_device_get_by_name("gpio");
    bflb_gpio_init(gpio_1637, TM1637_CLOCK, GPIO_OUTPUT); // 修改为 TM1637_CLOCK
    bflb_gpio_init(gpio_1637, TM1637_DATA, GPIO_OUTPUT);  // 修改为 TM1637_DATA
}

void clock_set()
{
    bflb_gpio_set(gpio_1637, TM1637_CLOCK); // 修改为 TM1637_CLOCK
}

void clock_reset()
{
    bflb_gpio_reset(gpio_1637, TM1637_CLOCK); // 修改为 TM1637_CLOCK
}

void data_set()
{
    bflb_gpio_set(gpio_1637, TM1637_DATA); // 修改为 TM1637_DATA
}

void data_reset()
{
    bflb_gpio_reset(gpio_1637, TM1637_DATA); // 修改为 TM1637_DATA
}

void Delay_us(unsigned int us)
{
    bflb_mtimer_delay_us(us);
}

void TM1637_start(void)
{
    clock_set();
    data_set();
    Delay_us(2);
    data_reset();
}

void TM1637_ack(void)
{
    unsigned char i = 0;
    clock_reset();
    Delay_us(5);
    while (bflb_gpio_read(gpio_1637, TM1637_DATA) && (i < 250))
    {
        i++;
    }
    clock_set();
    Delay_us(2);
    clock_reset();
}

void TM1637_stop(void)
{
    clock_reset();
    Delay_us(2);
    data_reset();
    Delay_us(2);
    clock_set();
    Delay_us(2);
    data_set();
    Delay_us(2);
}

void TM1637_Write(unsigned char DATA)
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        clock_reset();
        if (DATA & 0x01)
        {
            data_set();
        }
        else
        {
            data_reset();
        }
        Delay_us(3);
        DATA = DATA >> 1;
        clock_set();
        Delay_us(3);
    }
}

void TM1637_display(unsigned char numer1, unsigned char numer2, unsigned char numer3, unsigned char numer4, unsigned char colon, enum LIGHT_DEGREE level)
{
    // 写 SRAM 数据地址自动加 1 模式
    TM1637_start();
    // 发送起始地址
    TM1637_Write(0x40);
    TM1637_ack();
    TM1637_stop();
    TM1637_start();
    TM1637_Write(0xc0);
    TM1637_ack();

    TM1637_Write(tab[numer1]);
    TM1637_ack();
    TM1637_Write(tab[numer2] | colon << 7); // h为1时显示时钟中间的两点
    TM1637_ack();
    TM1637_Write(tab[numer3]);
    TM1637_ack();
    TM1637_Write(tab[numer4]);
    TM1637_ack();

    TM1637_stop();
    TM1637_start();
    TM1637_Write(level); // 开启显示
    TM1637_ack();
    TM1637_stop();
}
